<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文用户手册: 重复</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/usr_26.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>usr_26</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="usr_26.txt">usr_26.txt</a> </b>    适用于 Vim 9.0 版本。   最近更新: 2005年3月

                     <code class="vim">VIM 用户手册 - by Bram Moolenaar</code>
                                <code class="vim">译者</code>: Chimin Yen

                                  重复


编辑工作往往不是杂乱无章的。同一个修改动作常常会被重复多次。在本章中，我们将解
释几种有用的重复修改动作的方法。

 <a href="usr_26.html#26.1">26.1</a>   可视模式下的重复
 <a href="usr_26.html#26.2">26.2</a>   加与减
 <a href="usr_26.html#26.3">26.3</a>   改动多个文件
 <a href="usr_26.html#26.4">26.4</a>   在外壳脚本里使用 Vim

        下一章:  <a href="usr_27.html#usr_27.txt">usr_27.txt</a>   查找命令及模式
        前一章:  <a href="usr_25.html#usr_25.txt">usr_25.txt</a>   编辑带格式的文本
          目录:  <a href="usr_toc.html#usr_toc.txt">usr_toc.txt</a> 

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="26.1">26.1</a> </b>  可视模式下的重复</h4>
可视模式在反复修改一段文本方面十分方便。你可以看见高亮的文本，从而确定是否改对
了地方。但选择文本也得打几个字。"gv" 命令再次选择上次选过的文本，让你对同一段
文本再作别的修改。
   假定你有几行文本，你要把其中的 "2001" 改成 "2002"，以及 "2000" 改成 "2001":

<code class="section">        The financial results for 2001 are better </code>
<code class="section">        than for 2000.  The income increased by 50%，</code>
<code class="section">        even though 2001 had more rain than 2000. </code>
<code class="section">                        2000            2002 </code>
<code class="section">        income          45,403          66,234 </code>

首先把 "2001" 改成 "2002"。在可视模式下选择这几行文本，并执行: 
<code class="example"></code>
<code class="example">        :s/2001/2002/g</code>
<code class="example"></code>
现在用 "gv" 命令再次选择同一文本。光标在哪儿都没关系。然后用 ":s/2000/2001/g"
命令作第二项修改。
   很明显，你可以多次重复这些动作。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="26.2">26.2</a> </b>  加与减</h4>
当你反复地把一个数改成另一个时，你常遇到定值的偏移。在上例中，每个年份都加了
一。与其为每个要修改的年份都键入一个替换命令，不如利用 <code class="keystroke">CTRL-A</code> 命令。
   在上面这段文本中搜索年份: 
<code class="example"></code>
<code class="example">        /19[0-9][0-9]\|20[0-9][0-9]</code>
<code class="example"></code>
现在按 <code class="keystroke">CTRL-A</code>。找到的年份增加了一:

<code class="section">        The financial results for 2002 are better </code>
<code class="section">        than for 2000.  The income increased by 50%，</code>
<code class="section">        even though 2001 had more rain than 2000. </code>
<code class="section">                        2000            2001 </code>
<code class="section">        income          45,403          66,234 </code>

用 "n" 命令找到下一个年份，并按 "." 重复 <code class="keystroke">CTRL-A</code> 命令 (键入 "." 会快一点儿)。为
所有找到的年份重复 "n" 和 "."。
   提示: 设定 <a href="options.html#'hlsearch'">'hlsearch'</a> 选项以突显那些你要修改的数字，然后你可以提前观察并修
改得快些。

你可以在 <code class="keystroke">CTRL-A</code> 之前附加数字来增加一个大于一的数。假定你有这么个列表:

<code class="section">        1. item four </code>
<code class="section">        2. item five </code>
<code class="section">        3. item six </code>

把光标移到 "1." 上并键入: 
<code class="example"></code>
<code class="example">        3 CTRL-A</code>
<code class="example"></code>
那个 "1." 就变成了 "4."。同样，你可以用 "." 命令对其它数字重复这项修改。

再看一个例子:

<code class="section">        006     foo bar </code>
<code class="section">        007     foo bar </code>

在这些数字上执行 <code class="keystroke">CTRL-A</code> 产生了以下结果:

<code class="section">        007     foo bar </code>
<code class="section">        010     foo bar </code>

7 加 1 等于 10？这是因为 Vim 根据首位出现的 "0" 而误以为 "007" 是个八进位数
字。这种表示法常用于 C 程序。如果你不要首位为 "0" 的数字被处理成八进位数字，请
用这个命令: 
<code class="example"></code>
<code class="example">        :set nrformats-=octal</code>
<code class="example"></code>
<code class="keystroke">CTRL-X</code> 命令用于减数字，用法与加数字类似。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="26.3">26.3</a> </b>  改动多个文件</h4>
假定你有个变量名为 "x_cnt" 而你要把他改为 "x_counter"。这个变量在多个 C 文件都
被用到了。你需要在所有文件中作此改动。你得这么做。
   把所有相关文件放进参数列表: 
<code class="example"></code>
<code class="example">        :args *.c</code>

这个命令会找到所有的 C 文件并编辑其中的第一个。现在你可以对所有这些文件执行替
代命令: 
<code class="example"></code>
<code class="example">        :argdo %s/\&lt;x_cnt\&gt;/x_counter/ge | update</code>
<code class="example"></code>
命令 ":argdo" 把另一个命令当作其参数。而后者将对参数列表内所有的文件执行。
   作为参数的替代命令 "%s" 作用于所有文本行。它用 "\&lt;x_cnt\&gt;" 来查找 "x_cnt"。
"\&lt;" 和 "\&gt;" 用来指定仅匹配那些完整的词，而不是 "px_cnt" 或 "x_cnt2"。
   替代命令的标志位中包含 "g"，用以置换同一行文本内出现的所有的匹配 "x_cnt"。
标志位 "e" 用于避免因文件中找不到 "x_cnt" 而出现错误信息。否则 ":argdo" 命令就
会在遇到第一个找不到 "x_cnt" 的文件时中断。
   字符 "|" 分隔两条命令。后面的 "update" 命令将那些有改动的文件存盘。如果没有
"x_cnt" 被改成 "x_counter"，这个命令什么也不做。

还有一个 ":windo" 命令，用于在所有窗口内执行其参数所规定的命令。以及 ":bufdo"
命令，对所有缓冲区执行其参数所规定的命令。使用中要小心，因为你在缓冲区列表中的
文件数量可能超过你能想像的。请用 ":buffers" 命令 (或 ":ls") 来检查缓冲区列表。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="26.4">26.4</a> </b>  在外壳脚本里使用 Vim</h4>
假定你要在很多文件内把字符串 "-person-" 改成 "Jones"，然后把它们打印出来。你该
怎么做？一种方法是键入许许多多命令。另一种是写个外壳脚本来完成这件工作。
   作为一个可视的交互式的编辑器，Vim 在执行普通模式命令时表现得极为出色。然而
在批量处理时，普通模式命令无法产生简洁的带有注释的命令文件；在此，你该转而利用
Ex 模式。该模式为你提供一种友好的命令行界面，方便你把命令写进一个批处理文件。
("Ex 命令" 无非是命令行 (:) 命令的另一个名称。)
   以下就是你所需要的 Ex 模式命令: 
<code class="example"></code>
<code class="example">        %s/-person-/Jones/g</code>
<code class="example">        write tempfile</code>
<code class="example">        quit</code>
<code class="example"></code>
你把这些命令放进文件 "change.vim" 里。现在就用这个外壳脚本在批量模式下运行编辑
器: 
<code class="example"></code>
<code class="example">        for file in *.txt; do</code>
<code class="example">          vim -e -s $file &lt; change.vim</code>
<code class="example">          lpr -r tempfile</code>
<code class="example">        done</code>
<code class="example"></code>
循环 for-done 是一个外壳结构，用来重复执行循环结构内的两行命令，而变量 $file
则在每次循环时被设成不同的文件名。
   脚本第二行的作用是对文件 $file 运行 Vim 且在 Ex 模式下 (参数 -e)，并从文件
"change.vim" 读取命令。参数 -s 告诉 Vim 运行在安静模式下。换言之，不要持续不断
的发出 :prompt，或针对那个问题发出的任何别的提示。
   命令 "lpr -r tempfile" 打印执行中产生的文件 "tempfile" 并把它删除 (是参数
-r 的作用)。


从 标 准 输 入 读 取

Vim 能从标准输入读取文本。由于通常从那里读取的是命令，你得告诉 Vim 你读的是文
本。这需要在通常是文件名的地方传送一个参数 "-"。例如: 
<code class="example"></code>
<code class="example">        ls | vim -</code>
<code class="example"></code>
这个命令让你编辑 "ls" 命令的输出结果，而不必先把那些输出文本存入一个文件。
   如果你从标准输入读取文本，那么你可以用参数 "-S" 来读取脚本: 
<code class="example"></code>
<code class="example">        producer | vim -S change.vim -</code>
<code class="example"></code>
<code class="example"></code>
普 通 模 式 脚 本

如果你真的要在脚本内利用普通模式命令，你可以这样来用: 
<code class="example"></code>
<code class="example">        vim -s script file.txt ..。</code>

        <code class="note">注意</code>:
        当 "-s" 不与 "-e" 一起用时，它的意思是不同的。此时，它的意思是把文件
        "script" 里的命令当作普通模式命令来执行。而与 "-e" 一起用时，它的意思
        是保持安静，并不会把下一个参数视为文件名。

文件 "script" 里的命令就像你键入它们那样得到执行。别忘了换行符被解释成按下回车
键 <code class="special">&lt;Enter&gt;</code>。在普通模式下该键把光标移到下一行。
   要创建这么一个脚本你可以编辑这个脚本文件，键入那些命令。你得想象每个命令会
产生什么样的结果。这可不那么容易。另一种方法是在你手动执行那些命令时把它们记录
下来。你可以采用下面的方法: 
<code class="example"></code>
<code class="example">        vim -w script file.txt ..。</code>
<code class="example"></code>
所有键入的字符都将被写进文件 "script"。如果你犯了个小错误，不妨继续输入。但要
记得事后更正一下这个脚本文件。
   参数 "-w" 会将新键入的命令附加在一个已存在的脚本文件末尾。这在你需要一点儿
一点儿记录该脚本时是很不错的。但当你要从零开始重新记录你的脚本时，你则需要用
"-W" 参数。该参数重写任何已存在的文件。

</section><hr class="doubleline" /><section class=inner>
<h4></h4>下一章:  <a href="usr_27.html#usr_27.txt">usr_27.txt</a>   查找命令和模式

版权: 参见  <a href="usr_01.html#manual-copyright">manual-copyright</a>   vim:tw=78:ts=8:noet:ft=help:norl:
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
